<?php
/**
 *
 * JS, CSS 패킹 및 뷰어 세팅 class
 *
 * @author hmkim <gudals@gmail.com>
 *
 */

class commViewer
{
    // 기본 템플릿
    private static $sTemplate = 'default.html';

    // css 패킹 파일 명
    private static $cssFileName = 'common';
    private static $cssPackingName = '';

    // js 패킹 파일 명
    private static $jsFileName = 'common';
    private static $jsPackingName = '';

    // css 패킹 파일 리스트
    private static $aCssFile = array('common');
    // js 패킹 파일 리스트
    private static $aJsFile = array('base');

    // 추가 할 js 파일 내용
    private static $addScript = '';
    private static $aAddScriptLink = array();

    // 타이틀
    protected static $sTitle = 'Framework Start!!';

    public static function display($sContents)
    {
        // title
        $title_in_template = self::$sTitle;
        // css
        $css_in_template = self::getOptimizerCss();
        // 컨텐츠
        $contents_in_template = $sContents;
        // js
        $js_in_template = self::getOptimizerJs();

        require_once(SC_DIR_VIEW.'/template/'.self::$sTemplate);

    }

    public static function loadPacking()
    {
        // css load
        commViewer::css();

        // js load
        commViewer::js();
    }

    /**
     *
     * JS 태그를 생성한다.
     */
    public static function getOptimizerJs()
    {
        //if (empty(self::$jsPackingName)) return false;

        // debug 모드의 is_packing = 1 일 때 패킹 하지 않는다.
        if (SC_JS_CSS_PACKING == 1) {
            $_js = self::getNotOptimizerJs();

        } else {
            $_js = '<script src="/js/static/'.self::$jsPackingName.'" type="text/javascript"></script>'."\r\n";
        }
        
        // 추가 할 스크립트 링크가 있을 경우
        if (empty(self::$aAddScriptLink) === false) {
            $_js .= self::getAddJsLink();
        }

        // 추가 할 스크립트 내용이 있을 경우
        if (empty(self::$addScript) === false) {
            $_js .= self::getAddJs();
        }

        return $_js;
    }

    /**
     *
     * 패킹 되지 않은 js 태그를 생성한다.
     * @return string
     */
    private static function getNotOptimizerJs()
    {
        $_js = '';
        foreach (self::$aJsFile as $key => $val) {
            $_js .= '<script src="/js/'.$val.'.js" type="text/javascript"></script>'."\r\n";
        }

        return $_js;
    }

    /**
     *
     * JS 를 상태에 따라 패킹 한다.
     * @param array $aJs
     */
    public static function js()
    {
        if (SC_JS_CSS_PACKING != 1) {
            self::$jsPackingName = utilPacker::js(self::$jsFileName, self::$aJsFile);
        }
    }

    public static function _js($aJs)
    {
        if (!is_array($aJs) || empty($aJs) === true) return false;

        // 파일 이름 세팅
        self::$jsFileName = $aJs['name'];

        // 파일 리스트 세팅
        $aJsFile = array_merge(self::$aJsFile, $aJs['file_list']);
        self::$aJsFile = $aJsFile;
    }

    /**
     *
     * 추가 할 스크립트 적용
     * @param string $sScript
     */
    public static function addJs($sScript)
    {
        if (empty($sScript)) return false;

        self::$addScript = $sScript;
    }

    public static function getAddJs()
    {
        $_script = '';
        if (empty(self::$addScript) === false) {
            $_script .= '<script type="text/javascript">'."\r\n";
            $_script .= '<!--'."\r\n";
            
            $_script .= '$(function () {'."\r\n";
            $_script .= self::$addScript."\r\n";
            $_script .= '});'."\r\n";
            
            $_script .= '//-->'."\r\n";
            $_script .= '</script>'."\r\n";
        }

        return $_script;
    }
    
    /**
     * 
     * 추가할 스크립트 링크 적용
     * @param array $aScriptLink
     */
    public static function addJsLink($aScriptLink)
    {
        if (empty($aScriptLink) || count($aScriptLink)) return false;
        
        self::$aAddScriptLink = $aScriptLink;
    }
    
    public static function getAddJsLink()
    {
        $_aScript = array();
        $_len = count(self::$aAddScriptLink);
        $_script = '';
        if ($_len) {
            for ($i = 0; $i < $_len; $i++) {
                $_src = self::$aAddScriptLink[$i];
                $_aScript[] = '<script src="'.$_src.'" type="text/javascript"></script>';
            }
            
            $_script = implode('\n', $_aScript);
        }
        
        return $_script;
    }

    /**
     *
     * CSS 태그를 생성한다.
     */
    public static function getOptimizerCss()
    {
        // debug 모드의 is_packing = 1 일 때 패킹 하지 않는다.
        if (SC_JS_CSS_PACKING == 1) {
            $_css = self::getNotOptimizerCss();

        } else {
            $_css = '<link href="/style/static/'.self::$cssPackingName.'" media="screen" rel="Stylesheet" type="text/css" />'."\r\n";
        }

        return $_css;
    }

    /**
    *
    * 패킹 되지 않은 css 태그를 생성한다.
    * @return string
    */
    private static function getNotOptimizerCss()
    {
        $_css = '';
        foreach (self::$aCssFile as $key => $val) {
            $_css .= '<link href="/style/'.$val.'.css" media="screen" rel="Stylesheet" type="text/css" />'."\r\n";
        }

        return $_css;
    }

    /**
     *
     * CSS 를 상태에 따라 패킹 한다.
     * @param array $aCss
     */
    public static function css()
    {
        if (SC_JS_CSS_PACKING != 1) {
            self::$cssPackingName = utilPacker::css(self::$cssFileName, self::$aCssFile);
        }
    }

    public static function _css($aCss)
    {
        if (!is_array($aCss) || empty($aCss) === true) return false;

        // 파일 이름 세팅
        self::$cssFileName = $aCss['name'];

        // 파일 리스트 세팅
        $aCssFile = array_merge(self::$aCssFile, $aCss['file_list']);
        self::$aCssFile = $aCssFile;
    }

    /**
     *
     * TITLE 세팅
     * @param string $sTitle
     */
    public static function setTitle($sTitle)
    {
        if (empty($sTitle)) return false;

        self::$sTitle = $sTitle;
    }

    public static function getTitle()
    {
        return self::$sTitle;
    }

    /**
     *
     * header 세팅
     * @param string $sMimeType
     * @param string $sEncoding 
     */
    public static function _header($sMimeType = 'text/html', $sEncoding = 'utf-8')
    {
        header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
        header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
        header("Cache-Control: no-store, no-cache, must-revalidate");
        header("Cache-Control: post-check=0, pre-check=0", false);
        header("Pragma: no-cache");
        header("Content-type: ".$sMimeType."; charset=".$sEncoding);
    }
}